package com.atxyj.proxy.dynamic;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @author xieyujiao
 * @description
 * @date 2021/9/3
 */
public class ProxyTest {

    public static void main(String[] args) {
        //被代理对象
        Subject realSubject = new RealSubject();
        //实现了 InvocationHandler 接口，能够实现将方法调用从代理类到被代理类对象分派转发
        //其内部通常包含指向委托类实例的引用，用于真正执行分派转发过来的方法调用.
        //也即为要代理哪个真实对象，就将该对象传进去，最后是通过该代理对象来调用其方法
        InvocationHandler handler = new InvocationHandlerImpl(realSubject);

        ClassLoader loader = realSubject.getClass().getClassLoader();
        Class[] interfaces = realSubject.getClass().getInterfaces();

        //此方法用指定类装载器、一组接口、处理器生成动态代理类实例
        //这里subject会生成一个代理类，它继承自Proxy，并实现了动态代理接口Subject
        //这里的subject实际是这个类的一个实例，那么我们调用它的sayHello方法，就是调用我们定义的InvocationHandlerImpl的 invoke方法
        Subject subject = (Subject) Proxy.newProxyInstance(loader, interfaces, handler);

        System.out.println("动态代理对象的类型："+subject.getClass().getName());

        String hello = subject.sayHello("lisa");

        System.out.println(hello);

    }
}
